# 机器学习进阶-边缘检测-Canny边缘检测
# 1.cv2.Canny(进行Canny边缘检测)
import cv2
import matplotlib.pyplot as plt
import numpy as np

# 第一步：加载图片
img = cv2.imread('lena.png', 0)

# 第二步：使用cv2.pyrDown进行金字塔的下采样
down = cv2.pyrDown(img)

# 按照步骤编写
# 第三步：进行高斯滤波操作，即进行高斯卷积
guassin = cv2.GaussianBlur(img, (5, 5), 1)

# 第四步：去除矩阵的偶数行
guassin_x = []
rows, columns = guassin.shape[:2]
for i in range(rows):
    if i % 2 == 1:
        guassin_x.append(guassin[i, :])

guassin_x = np.array(guassin_x)
# 第五步：去除矩阵的偶数列
guassin_y = []
for i in range(columns):
    if i % 2 == 1:
        guassin_y.append(guassin_x[:, i])

guassin_y = np.array(guassin_y).T

# 第二步：使用cv2.pyUp进行金字塔的上采样
up = cv2.pyrUp(img)

# 按照步骤编写
# 第三步：使用自己的方法计算，在偶数行插入zero
rows_zeros = []
rows, columns = img.shape[:2]

for i in range(2 * rows):
    if i % 2 == 1:
        rows_zeros.append(np.zeros((1, columns)).astype(int).ravel())
    else:
        rows_zeros.append(img[int(i / 2), :])

rows_zeros = np.array(rows_zeros)

# 第四步：在偶数列插入zero
columns_zeros = []
for i in range(2 * columns):
    if i % 2 == 1:
        columns_zeros.append(np.zeros((rows*2, 1)).astype(int).ravel())
    else:
        columns_zeros.append(rows_zeros[:, int(i/2)])

columns_zeros = np.array(columns_zeros).T

# 第五步：进行高斯卷积操作，乘于4倍后做近似处理
add_img_columns_g = np.round(cv2.GaussianBlur(columns_zeros, (5, 5), 1)).astype(int) * 4
frames = []
# 对于大于255的像素做截断操作
for i in range(add_img_columns_g.shape[0]):
    frames = []
    for j in add_img_columns_g[i, :]:
        if j > 255:
            frames.append(255)
        else:
            frames.append(j)
    frames.append(frame)
frames = np.array(frames)

# 第六步： 对两种结果进行画图
images = [img, down, guassin_y, up, frames]
titles = ['IMG', 'DOWN', 'GUASSIN_Y', 'UP', 'FRAMES']

for i in range(5):
    plt.subplot(2, 3, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i])
plt.show()
